from faker import Faker
import random
from datetime import datetime, timedelta
# 创建一个中文本地化的 Faker 实例
fake = Faker('zh_CN')

p_id=[]
d_id=[]

patients_nums=100
doctor_nums=20
patient=[]
doctor=[]
for i in range(patients_nums):
    while True:
        id_number = str(random.randint(10000000, 99999999))  # 转换为字符串类型
        if id_number not in p_id:
            p_id.append(id_number)
            break
    name = fake.name()

    # 生成出生年月，假设出生日期在 1970 到 2000 之间
    birth_date = fake.date_of_birth(minimum_age=18, maximum_age=50)
    birth_date_str = birth_date.strftime('%Y-%m-%d')  # 格式化为 "yyyy-mm-dd"
    
    # 生成身份证号（模拟18位中国身份证号）
    # 简化的规则：前6位为随机生成的地区编码，后12位为随机生成的数字，最后一位为校验位
    area_code = random.randint(110000, 659004)  # 随机生成一个区域编码
    birth_code = birth_date.strftime('%Y%m%d')  # 使用出生日期生成出生年月日
    random_digits = random.randint(1000, 9999)  # 随机生成四个数字
    check_digit = random.choice('0123456789X')  # 随机选择一个校验位（X 代表 10）
    
    id_card = f"{area_code}{birth_code}{random_digits}{check_digit}"
    phone_number = "1" + random.choice(['3', '4', '5', '6', '7', '8', '9']) + ''.join([str(random.randint(0, 9)) for _ in range(9)])

    patient.append({
        'p_id':str(id_number),
        'password':"123456",
        'phone':phone_number,
        'gender':str(random.randint(0,1)),
        'name':name,
        'id_card':id_card,
        'birthday':birth_code
    })

department=['内科','外科','儿科','口腔科','眼科']
for i in range(doctor_nums):
    while True:
        id_number = str(random.randint(10000000, 99999999))  # 转换为字符串类型
        if id_number not in p_id and id_number not in d_id:
            d_id.append(id_number)
            break
    name = fake.name()
    
    phone_number = "1" + random.choice(['3', '4', '5', '6', '7', '8', '9']) + ''.join([str(random.randint(0, 9)) for _ in range(9)])

    doctor.append({
        'd_id':str(id_number),
        'password':"123456",
        'phone':phone_number,
        'gender':str(random.randint(0,1)),
        'name':name,
        'type':str(0) if i<doctor_nums-2 else str(1),
        'department':department[i%5]
    })

medecines=[
    {'Name': '阿利芬胶囊', 'Price': 112.34},
    {'Name': '福治芬注射液', 'Price': 87.25},
    {'Name': '葡萄糖苯甲酸片', 'Price': 199.99},
    {'Name': '舒咳糖浆', 'Price': 45.50},
    {'Name': '泽力普片', 'Price': 120.60},
    {'Name': '维他美胶囊', 'Price': 78.89},
    {'Name': '钙维隆Forte', 'Price': 155.20},
    {'Name': '扑热息痛片', 'Price': 12.49},
    {'Name': '溴氯噻吨滴眼液', 'Price': 39.99},
    {'Name': '普美达片', 'Price': 63.10},
    {'Name': '氟康唑乳膏', 'Price': 95.30},
    {'Name': '可瑞克注射液', 'Price': 138.15},
    {'Name': '心得安片', 'Price': 220.99},
    {'Name': '神经安口服液', 'Price': 174.00},
    {'Name': '依托马普片', 'Price': 65.75},
    {'Name': '多沙普利片', 'Price': 56.45},
    {'Name': '环丙沙星糖浆', 'Price': 112.80},
    {'Name': '镇痛膏', 'Price': 85.65},
    {'Name': '奥美拉唑凝胶', 'Price': 54.99}
]
drug_id=[]
drugs=[]
for medecin in medecines:
    while True:
        id_number = str(random.randint(1000, 9999))  # 转换为字符串类型
        if id_number not in drug_id:
            drug_id.append(id_number)
            break
    drugs.append({
        'drug_id':str(id_number),
        'name':medecin['Name'],
        'price':medecin['Price'],
        'number':random.randint(0,20)
    })
raw_check=[
    {'Name': 'CT扫描', 'Price': 850.00},
    {'Name': '核磁共振检查', 'Price': 1200.00},
    {'Name': '血液常规检查', 'Price': 180.50},
    {'Name': '肝功能检查', 'Price': 220.00},
    {'Name': '胸部X光检查', 'Price': 150.00},
    {'Name': '超声波检查', 'Price': 500.00},
    {'Name': '心电图检查', 'Price': 100.00},
    {'Name': '皮肤病理检查', 'Price': 250.00},
    {'Name': '乳腺超声检查', 'Price': 350.00},
    {'Name': '尿常规检查', 'Price': 80.00}
]

check_id=[]
check=[]
for c in raw_check:
    while True:
        id_number = str(random.randint(100, 999))  # 转换为字符串类型
        if id_number not in check_id:
            check_id.append(id_number)
            break
    check.append({
        'check_id':str(id_number),
        'name':c['Name'],
        'price':c['Price'],
    })
def random_datetime(start, end):
    """生成一个在start和end之间的随机日期时间"""
    delta = end - start
    int_delta = (delta.days * 24 * 60 * 60) + delta.seconds
    random_second = random.randrange(int_delta)
    return start + timedelta(seconds=random_second)
arrange_id=[]
arrange = []
have_finish_id=[]
#3天,24h，72个时间段，每个时间段有len(d_id)个医生,每个医生有五个预约
for d in d_id:
    #对于每一个医生
    for i in range(3):
        #随机得到一个大小为9的数组，其每一个值都是0-10的随机数
        appointments=[random.randint(0,10) for _ in range(9)]
        for t,index in enumerate(appointments):
            #第i天,9+index点到10+index这个时间段，有t个预约
            temp_p_id=[]
            for j in range(t):
                while True:
                    id_number = str(random.randint(10000, 99999))
                    if id_number not in arrange_id:
                        arrange_id.append(id_number)
                        break
                while True:
                    temp_p=random.choice(p_id)
                    if temp_p not in temp_p_id:
                        temp_p_id.append(temp_p)
                        break
                temp_time=random_datetime(datetime(2025,1,7+i,9+index,0,0),datetime(2025,1,7+i,10+index,0,0))
                tmp={
                    'arrange_id':"ARR"+(id_number),
                    'p_id':temp_p,
                    'd_id':d,
                    'arrange_time':temp_time,
                    'if_pay':str(random.randint(0,1)),
                    'if_reserve':str(random.randint(0,1)),
                    'if_finish':str(random.randint(0,2)),
                }
                arrange.append(tmp)
                if tmp['if_finish']=='2':
                    tmp['if_pay']='1'
                    have_finish_id.append(tmp)
                elif tmp['if_finish']=='1':
                    tmp['if_pay']='1'
p_r_id=[]
symptoms =[
    "患者出现持续咳嗽、咳痰，伴有轻度呼吸急促，体温稍微升高，考虑为上呼吸道感染。",
    "患者出现头痛、发热、乏力，食欲减退，体温升高，伴有轻微咳嗽，疑似流感症状。",
    "患者有持续腹痛、腹胀，伴随恶心呕吐，排便不规律，可能为急性胃肠炎。",
    "患者出现胸痛、呼吸急促，伴有乏力和眩晕，考虑为心绞痛的可能性。",
    "患者有下腹部疼痛，伴随尿频、尿急，考虑为泌尿系统感染，需做尿检确认。",
    "患者因工作压力大，情绪不稳，伴有失眠、食欲不振等，疑似焦虑症。",
    "患者出现恶心、呕吐，伴有轻微头痛和眩晕，可能为食物中毒或胃炎。",
    "患者感到全身乏力，晨起关节疼痛，尤其是膝关节，可能为类风湿性关节炎。",
    "患者头晕、恶心，伴有轻微胸闷，体力下降，疑似高血压引起的头痛。",
    "患者出现恶心、呕吐，腹痛较剧烈，可能为急性阑尾炎，需要尽早就医。",
    "患者出现皮肤瘙痒、红肿，伴有轻微咳嗽，可能为过敏性反应。",
    "患者体温升高，咳嗽加重，咳痰呈黄绿色，可能为细菌性肺炎。",
    "患者出现持续腹泻、腹痛，伴有发热，怀疑为肠道感染或细菌性食物中毒。",
    "患者出现肌肉无力，关节疼痛，体力下降，可能为慢性疲劳综合症。",
    "患者胸口痛，呼吸困难，伴随恶心、出汗，考虑为心肌梗死的可能性。",
    "患者出现咳嗽加重、发热，伴随呼吸急促，疑似肺炎。",
    "患者有严重头痛，视物模糊，伴随恶心、呕吐，可能为偏头痛。",
    "患者出现背痛，伴随腰部僵硬，可能为脊柱问题或腰椎间盘突出。",
    "患者有吞咽困难，伴随喉咙疼痛，可能为咽喉炎或食管疾病。",
    "患者出现食欲不振，体重减轻，伴随持续腹痛，可能为胃肠道疾病。",
    "患者出现高热、咳嗽，咳痰呈绿色，疑似支气管炎。",
    "患者感到胸部紧压感，呼吸急促，伴有出汗，考虑为心脏问题。",
    "患者有严重的关节肿胀，活动受限，伴随红热疼痛，可能为痛风发作。",
    "患者出现长期失眠、焦虑，伴有头痛和情绪波动，可能为抑郁症。",
    "患者有长期咳嗽、痰中带血，伴随夜间盗汗，可能为结核感染。",
    "患者腹部胀满，伴随排气不畅和肠鸣音增多，疑似消化不良。",
    "患者体温波动，寒战伴随发热，出现皮疹，考虑为流行性感冒。",
    "患者常感到胸闷、呼吸急促，偶尔胸痛，疑似哮喘发作。",
    "患者出现肢体麻木、无力，伴随视力模糊，可能为中风症状。",
    "患者伴有长期反酸、嗳气，可能为胃食管反流病，需检查胃肠功能。",
    "患者近期出现较为剧烈的头痛、恶心，偶有呕吐，疑似脑部问题。",
    "患者持续性腹泻，腹部不适，伴随体重减轻，可能为肠易激综合症。",
    "患者出现咳嗽加剧、咳痰呈血丝，可能为慢性支气管炎加重。",
    "患者有恶心、呕吐，伴随发热，体力虚弱，可能为急性胃肠炎。",
    "患者有持续性的体重减轻，食欲不振，考虑为消化系统问题。",
    "患者感到全身肌肉疼痛，关节僵硬，伴随发热，可能为风湿性关节炎。",
    "患者出现皮疹、瘙痒，伴随呼吸急促，怀疑为过敏性反应。",
    "患者常感头晕，走路不稳，伴随恶心，可能为低血压或贫血。",
    "患者体温偏高，咳嗽严重，呼吸困难，考虑为肺炎症状。",
    "患者出现极度疲劳，伴随全身肌肉酸痛，可能为慢性疲劳综合症。",
    "患者持续胸痛，伴随剧烈呼吸急促，考虑为心脏病症状。",
    "患者出现恶心、呕吐、腹痛，伴随便血，疑似消化道出血。",
    "患者有持续性的头痛，伴随恶心、呕吐，考虑为脑血管问题。",
    "患者感到上腹部不适，伴随胀气、食欲减退，可能为消化不良。",
    "患者有胸痛、气短，伴随头晕、乏力，疑似心绞痛。",
    "患者出现剧烈的腰痛，伴随下肢麻木，可能为坐骨神经痛。",
    "患者长期咳嗽、喘息，伴随呼吸急促，怀疑为哮喘。",
    "患者有持续的腹痛、呕吐，伴随体重减轻，可能为胃癌。",
    "患者伴有呼吸急促、胸痛，可能为肺栓塞，需要尽早就医。",
    "患者出现剧烈腹泻、呕吐，伴随全身乏力，考虑为肠胃感染。",
    "患者有胸闷、乏力，伴随轻微呼吸急促，可能为心脏病的前兆。",
    "患者有持续的皮肤瘙痒，伴随轻微红肿，可能为湿疹。",
    "患者有腹痛、腹泻，伴随食欲不振，可能为消化系统疾病。",
    "患者出现明显咳嗽，伴随痰多、乏力，怀疑为支气管炎。",
    "患者体温升高，伴随轻微咳嗽，疑似上呼吸道感染。",
    "患者感到咽喉痛，伴随轻微发热，可能为咽喉炎。",
    "患者出现胸痛，伴随呼吸困难，可能为气胸。",
    "患者腹痛持续，伴随恶心、呕吐，考虑为急性肠炎。",
    "患者感到下肢麻木，伴随行走不稳，可能为糖尿病并发症。",
    "患者有下腹痛，伴随排尿困难，可能为尿路感染。",
    "患者有持续的头痛、嗜睡，伴随恶心，考虑为脑震荡。",
    "患者出现关节疼痛，伴随僵硬，可能为关节炎。",
    "患者长期腹胀，排气不畅，可能为胃肠道功能失调。",
    "患者有剧烈咳嗽，伴随发热，怀疑为肺结核。",
    "患者出现持续的腹泻、便血，伴随发热，可能为结肠炎。",
    "患者有持续咳嗽、气喘，伴随乏力，可能为过敏性气喘。",
    "患者感到胸口痛，伴随气短，考虑为心脏病发作。",
    "患者出现食欲不振、恶心，伴随腹部胀气，可能为胃炎。",
    "患者有胸闷、头晕，伴随轻微呼吸急促，可能为低血糖。",
    "患者感到持续疲劳，伴随失眠，可能为慢性疲劳综合症。",
    "患者出现肢体麻木，伴随头晕，怀疑为中风症状。",
    "患者持续发热、咳痰，伴随体力下降，考虑为肺炎。",
    "患者感到咳嗽加重，伴随发热，怀疑为支气管炎。",
    "患者有明显腹痛，伴随呕吐，疑似急性阑尾炎。",
    "患者长期腰部疼痛，伴随活动受限，可能为脊柱问题。",
    "患者有持续头痛，伴随眩晕，考虑为脑部疾病。",
    "患者感到咳嗽加重，伴随痰多，怀疑为呼吸道感染。",
    "患者感到胸口痛，伴随呼吸急促，可能为肺部问题。",
    "患者有腹胀，排气困难，可能为消化不良。",
    "患者伴随发热、头痛，怀疑为流感症状。",
    "患者感到全身酸痛，伴随乏力，可能为慢性疲劳症。",
    "患者出现关节肿胀，伴随疼痛，可能为类风湿性关节炎。",
    "患者有持续的胃痛，伴随食欲不振，疑似胃溃疡。",
    "患者有呼吸急促、胸痛，伴随出汗，可能为心绞痛。",
    "患者出现咳痰，伴随呼吸急促，可能为慢性支气管炎。",
    "患者感到胸闷，呼吸困难，怀疑为心脏问题。",
    "患者有长期背部疼痛，伴随活动困难，可能为脊柱问题。",
    "患者出现明显腹痛，伴随恶心、呕吐，疑似胃肠炎。",
    "患者感到头晕、乏力，伴随持续咳嗽，可能为上呼吸道感染。",
    "患者有持续性头痛，伴随恶心，怀疑为偏头痛。",
    "患者感到腹胀，排气不畅，可能为胃肠道不适。",
    "患者持续体重减轻，食欲不振，可能为慢性胃肠病。",
    "患者有咳痰，伴随胸部不适，考虑为支气管炎。",
    "患者感到下腹痛，伴随尿急，疑似泌尿系感染。",
    "患者出现胸痛，伴随呼吸急促，怀疑为肺炎。",
    "患者持续腹痛，伴随体重减轻，可能为胃癌。",
    "患者出现全身无力，伴随关节疼痛，考虑为类风湿性关节炎。",
    "患者有明显的胸闷，呼吸困难，考虑为哮喘发作。",
    "患者出现持续头痛，伴随视力模糊，怀疑为视神经炎。",
    "患者出现背部疼痛，伴随活动受限，可能为肌肉拉伤。",
    "患者有持续的胃痛，伴随恶心呕吐，考虑为胃炎。",
    "患者感到四肢麻木，伴随视物模糊，怀疑为神经系统问题。",
    "患者有长期的胸痛，伴随呼吸困难，疑似肺结核。",
    "患者伴随胸口痛、呼吸急促，考虑为心绞痛。",
    "患者长期腹泻，伴随食欲不振，疑似结肠问题。",
    "患者感到胃部不适，伴随恶心，考虑为胃食管反流。",
    "患者有明显头痛，伴随呕吐，怀疑为偏头痛。",
    "患者持续发热，伴随恶心、呕吐，考虑为急性胃肠炎。",
    "患者有胸口痛，伴随呼吸急促，可能为心脏病发作。",
    "患者出现体重减轻，食欲不振，考虑为消化系统疾病。",
    "患者感到严重疲劳，伴随关节疼痛，怀疑为风湿性关节炎。",
    "患者有持续咳嗽，伴随轻微胸痛，怀疑为支气管炎。",
    "患者出现腹痛、腹泻，伴随体温升高，怀疑为肠道感染。",
    "患者有剧烈的腰痛，伴随下肢麻木，考虑为坐骨神经痛。",
    "患者有持续性头痛，伴随眩晕，怀疑为颈椎病。",
    "患者长期有背痛，伴随行动困难，怀疑为脊柱疾病。",
    "患者出现恶心、呕吐，腹部胀痛，怀疑为食物中毒。",
    "患者有上腹部不适，伴随嗳气，怀疑为胃食管反流。",
    "患者有胃痛、恶心，伴随食欲减退，可能为胃溃疡。",
    "患者有胸闷，伴随呼吸急促，怀疑为哮喘发作。",
    "患者出现呼吸急促，伴随胸痛，可能为肺炎。",
    "患者有发热，伴随头痛、咳嗽，可能为流感。",
    "患者感到胸痛，伴随呼吸困难，考虑为心脏问题。",
    "患者出现持续性腹痛，伴随腹泻，怀疑为急性胃肠炎。"
]

print(len(have_finish_id))
patient_record=[]
for tmp in have_finish_id:
    while True:
        id_number = str(random.randint(10000,99999))
        if id_number not in p_r_id:
            p_r_id.append(id_number)
            break
    patient_record.append({
        'p_r_id':"PR"+id_number,
        'p_id':tmp['p_id'],
        'd_id':tmp['d_id'],
        'condition_describe':tmp['arrange_id']+"*"+symptoms[random.randint(0,len(symptoms)-1)],
    })
m_id=[]
medical_record=[]
for p_r in p_r_id:
    while True:
        id_number=str(random.randint(10000,99999))
        if id_number not in m_id:
            m_id.append(id_number)
            break
    temp_drug_list=random.sample(drugs,random.randint(1,5))
    tmp={
        'm_id':"M"+id_number,
        'p_r_id':"PR"+p_r,
        'if_pay':str(random.randint(0,1)),
        'drug_list':"\n".join([drug['name']+" "+str(random.randint(1,5)) for drug in temp_drug_list]),
        'check_list':"\n".join([check['name'] for check in random.sample(check,random.randint(1,3))]),
        'if_check':str(random.randint(0,1)),
        'if_take':str(random.randint(0,1)),
        'time':[random_datetime(datetime(2025,1,7,9,0,0),datetime(2025,1,7,18,30,0)),random_datetime(datetime(2025,1,8,9,0,0),datetime(2025,1,8,18,30,0)),random_datetime(datetime(2025,1,9,9,0,0),datetime(2025,1,9,18,30,0))][random.randint(0,2)]
    }
    if tmp['if_check']=='1' or tmp['if_take']=='1':
        tmp['if_pay']='1'
    medical_record.append(tmp)

refund_nums=30
have_refund_id=[]
r_r_id=[]
refund_record=[]
for i in range(refund_nums):
    while True:
        id_number = str(random.randint(100000, 999999))  # 转换为字符串类型
        if id_number not in r_r_id:
            r_r_id.append(id_number)
            break
    while True:
        temp_m=random.choice(m_id)
        if temp_m not in have_refund_id:
            have_refund_id.append(temp_m)
            break
    refund_record.append({
        'r_r_id':"RR"+id_number,
        #修改这里的时间都是正常在范围内的
        'time':[random_datetime(datetime(2025,1,7,9,0,0),datetime(2025,1,7,18,30,0)),random_datetime(datetime(2025,1,8,9,0,0),datetime(2025,1,8,18,30,0)),random_datetime(datetime(2025,1,9,9,0,0),datetime(2025,1,9,18,30,0))][random.randint(0,2)],
        'm_id':"M"+temp_m,
        'type':str(random.randint(0,1)),
    })
import mysql.connector
import random

# 创建数据库连接
conn = mysql.connector.connect(
    host="localhost",     # 数据库地址
    user="root",          # 用户名
    password="0987654321",  # 密码
    database="hospitalsystem"   # 数据库名称
)

cursor = conn.cursor()

# 插入数据到 patient 表
def insert_patient(patient_data):
    query = "INSERT INTO patient (p_id, password, phone, gender, name, id_card, birthday) VALUES (%s, %s, %s, %s, %s, %s, %s)"
    values = (patient_data['p_id'], patient_data['password'], patient_data['phone'], patient_data['gender'],
              patient_data['name'], patient_data['id_card'], patient_data['birthday'])
    cursor.execute(query, values)

# 插入数据到 doctor 表
def insert_doctor(doctor_data):
    query = "INSERT INTO doctor (d_id, password, phone, gender, name, type, department) VALUES (%s, %s, %s, %s, %s, %s, %s)"
    values = (doctor_data['d_id'], doctor_data['password'], doctor_data['phone'], doctor_data['gender'],
              doctor_data['name'], doctor_data['type'], doctor_data['department'])
    cursor.execute(query, values)

# 插入数据到 drug 表
def insert_drug(drug_data):
    query = "INSERT INTO drug (drug_id, name, price, number) VALUES (%s, %s, %s, %s)"
    values = (drug_data['drug_id'], drug_data['name'], drug_data['price'], drug_data['number'])
    cursor.execute(query, values)

# 插入数据到 checkup 表
def insert_checkup(checkup_data):
    query = "INSERT INTO check_list (check_id, name, price) VALUES (%s, %s, %s)"
    values = (checkup_data['check_id'], checkup_data['name'], checkup_data['price'])
    cursor.execute(query, values)
def insert_arrange(arrange_data):
    query = "INSERT INTO arrange (arrange_id, p_id, d_id, arrange_time, if_pay, if_reserve, if_finish) VALUES (%s, %s, %s, %s, %s, %s, %s)"
    values = (arrange_data['arrange_id'], arrange_data['p_id'], arrange_data['d_id'], arrange_data['arrange_time'],arrange_data['if_pay'],arrange_data['if_reserve'],arrange_data['if_finish'])
    cursor.execute(query, values)
def insert_patient_record(patient_record_data):
    query = "INSERT INTO patient_record (p_r_id, p_id, d_id, condition_describe) VALUES (%s, %s, %s, %s)"
    values = (patient_record_data['p_r_id'], patient_record_data['p_id'], patient_record_data['d_id'], patient_record_data['condition_describe'])
    cursor.execute(query, values)
def insert_medical_record(medical_record_data):
    query = "INSERT INTO medical_record (m_id, p_r_id, if_pay, drug_list, check_list, if_check, if_take, time) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
    values = (medical_record_data['m_id'], medical_record_data['p_r_id'], medical_record_data['if_pay'], medical_record_data['drug_list'], medical_record_data['check_list'], medical_record_data['if_check'], medical_record_data['if_take'], medical_record_data['time'])
    cursor.execute(query, values)
def insert_refund_record(refund_record_data):
    query = "INSERT INTO refund_record (r_r_id, time, m_id, type) VALUES (%s, %s, %s, %s)"
    values = (refund_record_data['r_r_id'], refund_record_data['time'], refund_record_data['m_id'], refund_record_data['type'])
    cursor.execute(query, values)
# 插入 patient 数据
for patient_data in patient:
    insert_patient(patient_data)

# 插入 doctor 数据
for doctor_data in doctor:
    insert_doctor(doctor_data)

# 插入 drug 数据
for drug_data in drugs:
    insert_drug(drug_data)

# 插入 checkup 数据
for checkup_data in check:
    insert_checkup(checkup_data)

for arrange_data in arrange:
    insert_arrange(arrange_data)

for patient_record_data in patient_record:
    insert_patient_record(patient_record_data)
for medical_record_data in medical_record:
    insert_medical_record(medical_record_data)
for refund_record_data in refund_record:
    insert_refund_record(refund_record_data)

# 提交数据到数据库
conn.commit()

# 关闭数据库连接
cursor.close()
conn.close()

print("数据已成功插入到数据库中。")
